package generator.workflow.sfj.gridgain.j2xml_impl;

import generator.datastructure.WritebleClass;
import generator.datastructure.j2xml_impl.DocumentWrapper;
import generator.util.J2XMLManipulator;
import generator.util.DocTransformer;
import generator.workflow.sfj.gridgain.GridResult;

import java.io.File;

import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

/** 
 * La clase Wrapper es generada partiendo del template GridExecutorResult.xml. El mismo se trabaja
 * como un documento DOM y su estructura responde al formato impuesto por la biblioteca JavaToXml.
 * Por lo tanto, las operaciones que implementa se basan también en dicho formato.
 * @author Hirsch-Fernández
 */
public class GridResult_J2XML extends GridResult{
		
	/**Ruta del archivo template que se utilizará para construir el documento que representa la clase
	 * GR*/
	private String templateClass = "config"+System.getProperty("file.separator")+"JavaToXml"+System.getProperty("file.separator")+"GridGainGridifier"+System.getProperty("file.separator")+"GridExecutorResult.xml";
	
	/**Objeto que se utilizará para realizar operaciones genéricas sobre la clase java
	 * representada como documento DOM cuya estructura responde a la impuesta por la biblioteca
	 * JavaToXml*/
	private J2XMLManipulator jm;
	
	/**Documento que representa la clase Wrapper en todo momento del proceso de construcción
	 * de la misma.*/
	private Document GERDoc;
			
	
	/**Constructor vacío de la clase*/	 
	public GridResult_J2XML(){
		jm = new J2XMLManipulator();		
	}
	
	/**@return la ruta del archivo template que se utiliza para construir el documento
	 * base que representa  la clase GR.*/
	public String getTemplateClass() {
		return templateClass;
	}

	/**@param templateFilepath
	 *         ruta que especifíca el lugar donde se halla el template base que se utilizará para la
	 *         construcción  de la clase GR. El template es un archivo xml cuya estrucutura fue generada
	 *         haciendo uso de la biblioteca JavaToXml.	
	 */
	public void setTemplateClass(String templateFilepath){
		templateClass = templateFilepath;		
	}
	
	
	/**{@inheritDoc}*/
	@Override
	protected WritebleClass getGR() {
		return new DocumentWrapper(GERDoc);
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void setClassName(String className) {
		try {
			jm.setClassName(className, GERDoc);
		} catch (XPathExpressionException e) {
			System.err.println("Falló seteo del nombre de clase GridResult");
		}		
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void setClassPackage(String packageName) {
		jm.setPackage(packageName, GERDoc);
		
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void setConstructorParamType(String paramType) {
		try {
			Element type = jm.parseType(paramType);
			jm.setType(type, GERDoc, "/"+jm.CLASSFILENAME+"/"+jm.CLASS+"/"+jm.CONSTRUCTOR+"/"+jm.ALLPARAMS+"/"+jm.PARAM+"/"+jm.TYPE);
		} catch (XPathExpressionException e) {
			System.err.println("Falló seteo del tipo del parámetro del constructor de GridResult");
		}
		
	}
	
	
	/**{@inheritDoc}*/
	@Override
	protected void setGetterReturnType(String returnType) {
		try {
			Element type = jm.parseType(returnType);
			jm.setType(type, GERDoc, "/"+jm.CLASSFILENAME+"/"+jm.CLASS+"/"+jm.METHOD+"[@name=\"getResult\"]/"+jm.TYPE);
		} catch (XPathExpressionException e) {
			System.err.println("Falló seteo del tipo retornado por el método getResult() de la clase GridResult");
		}
		
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void setResultAttType(String resultAttType) {
		try {
			Element type = jm.parseType(resultAttType);
			jm.setType(type, GERDoc, "/"+jm.CLASSFILENAME+"/"+jm.CLASS+"/"+jm.ATTRIBUTE+"[@name=\"result\"]/"+jm.TYPE+"[1]");
		} catch (XPathExpressionException e) {
			System.err.println("Falló seteo del tipo del atributo de GridResult");
		}
		
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void startNewGridResultClass() {
		GERDoc = DocTransformer.xmlToDom(new File(this.templateClass));		
	}

	
	/**{@inheritDoc}*/
	@Override
	protected void setClassImports(WritebleClass gridifiedClass) {		
		jm.cloneImports(((DocumentWrapper)gridifiedClass).getDocument(), GERDoc);		
	}	

}
